package api

import (
	"reflect"
	"strings"

	"gitee.com/war2001/NiuMaEasyGo/nm_core/router"
	"github.com/gin-gonic/gin"
	"go.uber.org/zap"
)

// BaseController 基础控制器，提供通用功能
type BaseController struct {
	// 可以添加通用的字段
}

// RegisterSelf 自注册控制器
// 这个方法可以在控制器的init函数中调用，实现自动注册
func RegisterSelf(controller interface{}) {
	// 获取控制器类型名称
	controllerType := reflect.TypeOf(controller)
	controllerName := controllerType.String()

	// 记录日志
	zap.L().Debug("控制器自注册", zap.String("controller", controllerName))

	// 这里可以将控制器添加到全局注册表中
	// 但由于init函数执行时机的限制，这里只记录日志
	// 实际注册会在InitRouter中通过AutoDiscoverControllers完成
}

// GetControllerName 获取控制器名称
func GetControllerName(controller interface{}) string {
	t := reflect.TypeOf(controller)
	if t.Kind() == reflect.Ptr {
		t = t.Elem()
	}

	name := t.Name()
	// 移除Controller后缀
	if strings.HasSuffix(name, "Controller") {
		name = name[:len(name)-len("Controller")]
	}
	return name
}

// GenerateRouteMetadata 生成路由元数据
// 这是一个辅助方法，用于简化元数据的创建
func GenerateRouteMetadata(
	title string,
	path string,
	component string,
	icon string,
	permission string,
	parentPath string,
	menuType string,
	menuCategory string,
	method string,
	apiPath string,
	requireAuth bool,
	orderNum int,
	hidden bool,
) router.RouteMetadata {
	return router.RouteMetadata{
		Title:        title,
		Path:         path,
		Component:    component,
		Icon:         icon,
		Permission:   permission,
		ParentPath:   parentPath,
		MenuType:     menuType,
		MenuCategory: menuCategory,
		Method:       method,
		APIPath:      apiPath,
		RequireAuth:  requireAuth,
		OrderNum:     orderNum,
		Hidden:       hidden,
	}
}

// ControllerInfo 控制器信息
type ControllerInfo struct {
	Name        string
	Description string
	Version     string
	Author      string
	BasePath    string
}

// GetControllerInfo 获取控制器信息
// 子类可以重写此方法提供自定义信息
func (c *BaseController) GetControllerInfo() ControllerInfo {
	return ControllerInfo{
		Name:        "BaseController",
		Description: "基础控制器",
		Version:     "1.0",
		Author:      "System",
		BasePath:    "",
	}
}

// ResponseSuccess 返回成功响应
func (c *BaseController) ResponseSuccess(ctx *gin.Context, data interface{}) {
	ctx.JSON(200, gin.H{
		"code":    0,
		"message": "success",
		"data":    data,
	})
}

// ResponseError 返回错误响应
func (c *BaseController) ResponseError(ctx *gin.Context, code int, message string) {
	ctx.JSON(200, gin.H{
		"code":    code,
		"message": message,
	})
}

// ResponseBadRequest 返回请求参数错误响应
func (c *BaseController) ResponseBadRequest(ctx *gin.Context, message string) {
	ctx.JSON(400, gin.H{
		"code":    400,
		"message": message,
	})
}

// ResponseUnauthorized 返回未授权响应
func (c *BaseController) ResponseUnauthorized(ctx *gin.Context, message string) {
	ctx.JSON(401, gin.H{
		"code":    401,
		"message": message,
	})
}

// ResponseForbidden 返回禁止访问响应
func (c *BaseController) ResponseForbidden(ctx *gin.Context, message string) {
	ctx.JSON(403, gin.H{
		"code":    403,
		"message": message,
	})
}

// ResponseNotFound 返回资源不存在响应
func (c *BaseController) ResponseNotFound(ctx *gin.Context, message string) {
	ctx.JSON(404, gin.H{
		"code":    404,
		"message": message,
	})
}

// ResponseInternalError 返回内部错误响应
func (c *BaseController) ResponseInternalError(ctx *gin.Context, message string) {
	ctx.JSON(500, gin.H{
		"code":    500,
		"message": message,
	})
}
